![]() |
![]() |
|
Alle Überladungen sind statisch definiert und erwarten im ersten Parameter eine Type-Referenz, über die der Typ des Arrays bekannt gegeben wird. Dem zweiten Parameter wird die Größe des Arrays übergeben. Mit
erzeugen wir ein eindimensionales Array vom Typ Long, das zehn Elemente enthält. Dieses Array verfügt über dieselben Fähigkeiten, als hätten wir uns mit
eine Objektvariable besorgt. Es drängt sich sofort die Frage auf, wann wir ein auf diese Weise erzeugtes Array einsetzen können und welchen Vorteil CreateInstance bietet. Es bleibt zunächst einmal festzustellen, dass der Einsatz wohl nur bei relativ selten auftretenden Anwendungsfällen empfehlenswert ist. Dabei kommen solche in Betracht, bei denen zur Kompilierzeit noch nicht bekannt ist, von welchem Typ das Array zur Laufzeit sein muss. Zum anderen gibt es aber noch eine sehr interessante Variante der überladenen Methode. Wie Sie wissen, ist der erste Index eines Arrays immer 0. Mit CreateInstance können Sie von diesem Standard abweichen und den Startindex jeder beliebigen Dimension nach Bedarf festlegen:
Im ersten Parameter wird der Typ des Arrays bekannt gegeben, der zweite Parameter – der selbst ein Array ist – beschreibt die Größe jeder Dimension. Der dritte Parameter spezifiziert in einem Array die Untergrenzen jeder Dimension. Wir wollen nun mit dieser Methode ein dreidimensionales Array erzeugen, das den folgenden Anforderungen genügt: 1. Dimension: Untergrenze = 2/Anzahl der Elemente = 2 2. Dimension: Untergrenze = 5/Anzahl der Elemente = 3 3. Dimension: Untergrenze = 9/Anzahl der Elemente = 4 Das Codefragment, das uns eine Referenz auf ein solches Array-Objekt bereitstellt, würde wie folgt aussehen:
Wir haben ein Array vorliegen, das sich über den Standard der ansonsten üblichen Indexbasis 0 hinwegsetzt. Nun erklärt sich auch, warum in der Methodenliste eines Array-Objekts die Methode GetLowerBound aufgeführt ist, mit der die Untergrenze in jeder beliebigen Dimension erforscht werden kann. 10.5.2 Die Eigenschaften eines »Array«-Objekts
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Eigenschaft | Beschreibung |
| IsFixedSized | Gibt einen Boolean zurück, der Auskunft darüber gibt, ob das Array eine fixe Größe hat. Diese Eigenschaft ist für alle Arrays True. |
| IsReadOnly | Gibt einen Boolean zurück, der Auskunft darüber gibt, ob das Array schreibgeschützt ist. Diese Eigenschaft ist für alle Arrays False. |
| Length | Liefert die Gesamtanzahl der Array-Elemente in allen Dimensionen. |
| Rank | Die Anzahl der Dimensionen eines Arrays. |
Die beiden Eigenschaften IsFixedSize und IsReadOnly stammen aus dem Interface IList, das den indexbasierten Zugriff auf die Elemente beschreibt. Da herkömmliche Arrays grundsätzlich eine feste Größe haben und nicht schreibgeschützt sind, wird von diesen beiden Eigenschaften immer derselbe boolesche Wert zurückgeliefert.
Interessanter ist es schon zu wissen, wie groß die Gesamtanzahl aller Elemente eines Arrays ist. Length liefert uns diesen Wert. Die Eigenschaft Rank gibt die Anzahl der Dimensionen zurück, wobei ein eindimensionales Array die Zahl 1 liefert, und nicht – was nicht abwegig wäre – die Zahl 0.
Die Klasse Array implementiert die Schnittstelle ICloneable. Diese beschreibt die Methode Clone, mit der die 1:1-Kopie eines Objekts erzeugt werden kann. Der Rückgabetyp Object erzwingt die Konvertierung in den Zieldatentyp, der hier ein Array ist:
| Dim x() As Integer = {1, 2, 3, 4, 5, 6, 7} |
| Dim y() As Integer = x.Clone() |
Ein Array ist sehr flexibel und kann neben Wertetypen auch Referenztypen enthalten. Beim Klonen wird bitweise kopiert, was bei einem Array, das auf Referenztypen basiert, zur Folge hat, dass die Referenzen kopiert werden, jedoch nicht die darüber referenzierten Objekte.
Eine ähnliche Funktionalität weist die überladene statische Methode Copy auf. Während die Clone-Methode ziemlich rücksichtslos den Inhalt jedes Elements aus dem Quell- in das Ziel-Array kopiert, bietet Copy die Möglichkeit, nur einen Ausschnitt des Arrays zu erfassen.
| Public Shared Sub Copy(source As Array source, _ |
| destination As Array, length As Integer) |
Im ersten Parameter wird die Quelle angegeben, aus der kopiert werden soll, im zweiten Parameter wird das Ziel-Array genannt und im dritten Parameter die Anzahl der zu kopierenden Elemente. Der Kopiervorgang startet mit dem ersten Element.
Im folgenden Beispiel wollen wir zunächst ein größeres Array mit Werten initialisieren. Dazu lassen wir uns das Array mit Zufallszahlen füllen. Im nächsten Schritt kann der Anwender an der Konsole entscheiden, wie viele Elemente aus dem Original-Array in ein zweites Array kopiert werden sollen. Nach Abschluss der Operation werden die Inhalte aller Elemente der Kopie an der Konsole angezeigt.
| ' -------------------------------------------------------- |
| ' Beispiel: ...\Kapitel 10\ArrayKopieren |
| '--------------------------------------------------------- |
| Module Module1 |
| Sub Main() |
| Dim rnd As New System.Random() |
| Dim x(500) As Integer |
| Dim i As Integer |
| 'Quell-Array mit Zahlen füllen |
| For i = 0 To 500 |
| x(i) = rnd.Next(0, 1000) |
| Next |
| Console.Write("Wie viele Elemente sollen kopiert werden? ") |
| Dim count As Integer = Convert.ToInt32(Console.ReadLine()) |
| 'Teile des Quell-Arrays in das Ziel-Array kopieren |
| Dim y(count – 1) As Integer |
| Array.Copy(x, y, count) |
| 'Konsolenausgabe des Ziel-Arrays |
| For i = 0 To count – 1 |
| Console.WriteLine("Element {0,3} = {1,4}", i + 1, y(i)) |
| Next |
| Console.ReadLine() |
| End Sub |
| End Module |
Beachten Sie bitte, dass das Ziel-Array bereits richtig dimensioniert ist, bevor Sie die Copy-Methode anwenden.
Die mit
| Public Shared Sub Copy(source As Array, sourceindex As Integer, |
| destination As Array, destinationindex As Integer, |
| length As Integer) |
überladene Copy-Methode eröffnet uns weitergehende Möglichkeiten:
| Wir können bestimmen, ab welchem Index aus dem Quell-Array in das Ziel-Array kopiert werden soll. Diesen Wert übergeben wir dem zweiten Parameter. |
| Wir können den Startindex beliebig festlegen, ab dem die kopierten Daten in das Ziel-Array geschrieben werden. Diesen Wert übergeben wir dem vierten Parameter. |
| Letztendlich können wir auch festlegen, wie viele Elementdaten kopiert werden sollen. Dieses ist der Inhalt des fünften Parameters. |
Das Löschen von einem oder mehreren im Index aufeinander folgenden Elementen aus einem Array wird mit der Methode Clear zu einer einzeiligen Anweisung. Die Definition lautet:
| Public Shared Sub Clear(Array, Integer, Integer) |
Da die Methode statisch deklariert ist, wird sie auf dem Klassennamen aufgerufen. Im ersten Parameter verlangt der Aufruf die Referenz auf ein konkretes Objekt vom Typ Array, im zweiten den Index, ab dem aufeinander folgende Elemente gelöscht werden sollen, und im dritten die Anzahl der zu löschenden Elemente. Mit
| Dim arr() As Int32 = {1, 2, 3, 4, 5} |
| Array.Clear(arr, 1, 3) |
werden demnach die Elemente mit den Indizes 1, 2 und 3 verworfen.
Werden von einem Array Referenztypen verwaltet und auf das Array Clear aufgerufen, werden die Objekte nicht zerstört, sondern nur die vom Array verwalteten Referenzen. Ein Array verhält sich also nicht anders als eine Collection.
Die beiden Methoden GetUpperBound und GetLowerBound beschreiben die Grenzen eines Arrays. Beim Aufruf muss die Dimension als Argument übergeben werden. Dabei gilt: Die erste Dimension ist 0, die zweite 1 usw.
| Public Function GetUpperBound(Integer As Integer |
| Public Function GetLowerBound(Integer) As Integer |
GetLowerBound kommt weniger Bedeutung zu, weil das erste Element der meisten Arrays den Index 0 aufweist. Eine Ausnahme bilden Arrays, die mit CreateInstance erzeugt werden. GetUpperBound bietet sich insbesondere bei Schleifen an, die in einer bestimmten Dimension alle Elemente erfassen sollen. Ist das Array eindimensional, kann auch die Eigenschaft Length eingesetzt werden, welche die Anzahl aller Elemente in allen Dimensionen liefert.
Den reservierten Indizes eines Arrays können Sie beliebig Daten zuordnen, solange diese dem Typ des Arrays entsprechen. Die Daten liegen in der Regel in ungeordneter Reihenfolge vor. Mit Sort lassen sich die Elemente eines eindimensionalen Arrays sortieren, mit der Klassenmethode Reverse kann die aktuelle Elementreihenfolge eines beliebigen Arrays umkehrt werden.
| Public Shared Sub Sort(Array) |
| Public Shared Sub Reverse(Array) |
Die zu sortierenden Elemente müssen die Schnittstelle IComparable implementieren. Handelt es sich um das Array eines elementaren Datentyps oder um ein String-Array, ist die Sortierung kein Problem, da alle Typen die Forderung erfüllen – wie auch viele weitere Klassen des .NET Frameworks.
| Dim strStadt() As String = {"Berlin", "Zürich", "London", "Tokio"} |
| Array.Sort(strStadt) |
| Dim temp As String |
| For Each temp In strStadt |
| Console.WriteLine(temp) |
| Next |
| ' die Ausgabenreihenfolge lautet: Berlin, London, Tokio, Zürich |
Ist das Array vom Typ einer benutzerdefinierten Klasse, muss die Klasse um die Schnittstelle IComparable erweitert werden. Deren Methode CompareTo legt die Sortierreihenfolge zwischen zwei Elementen fest.
Das Array eines elementaren Datentyps zu sortieren bedarf keinerlei besonderer Maßnahmen. Typen, die nur ein Sortierkriterium bereitstellen sollen, genügt die Implementierung der IComparable-Schnittstelle. Soll optional die Sortierung nach mehreren Kriterien ermöglicht werden, reicht IComparable nicht aus. Hier spielt die Schnittstelle IComparer ihre Stärken aus, die es erlaubt, Vergleichsklassen zu definieren. Die Klasse Array berücksichtigt dies und überlädt die Methode Sort, unter anderem mit
| Public Shared Sub Sort(Array, IComparer) |
Da in Abschnitt 7.2.4 die Implementierung von Vergleichsklassen schon umfassend behandelt worden ist, soll an dieser Stelle auf ein weiteres Beispiel verzichtet werden.
| << zurück |
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken.
Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die
gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich
geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung,
Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.